﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using negocio.commons;
using negocio.readOnly;
using negocio.entidades;
using System.Data;
using System.Data.SqlClient;
using dao.daos;

namespace negocio.servicios
{
    public class ProveedorService
    {
        private readonly ProveedorDao daoProv = new ProveedorDao();


        public void Insertar(Proveedor proveedor)
        {
            string valores = GenerarStringValores(proveedor);
            daoProv.Insertar(valores);
        }

        public void Modificar(Proveedor proveedor)
        {
            string valores = GenerarStringValores(proveedor);
            string restriccion = string.Format("ID_PROVEEDOR = {0}", proveedor.IdProveedor);
            daoProv.Modificar(valores, restriccion);
        }

        //public List<Proveedor> ObtenerTodo()
        //{
        //    return LeerDataReaderList(daoProv.ObtenerTodo());
        //}

        //public List<Proveedor> ObtenerActivos()
        //{
        //    return LeerDataReaderList(daoProv.ObtenerActivos());
        //}

        public List<Proveedor> ObtenerTodo()
        {
            return LeerDataReaderList(daoProv.ObtenerTodo());
        }

        private List<Proveedor> LeerDataReaderList(SqlDataReader dr)
        {
            List<Proveedor> listBus = new List<Proveedor>();
            while (dr.Read())
            {
                Proveedor bus = new Proveedor();
                bus.IdProveedor = Convert.ToInt32(dr["ID_PROVEEDOR"]);
                bus.RazonSocial = Convert.ToString(dr["RAZON_SOCIAL"]);
                listBus.Add(bus);
            }
            dr.Close();
            return listBus;
        }

        public Proveedor ObtenerPorId(int idProveedor)
        {
            SqlDataReader dr = daoProv.ObtenerPorId(idProveedor);
            return LeerDataReader(dr);
        }

        private Proveedor LeerDataReader(SqlDataReader dr)
        {
            Proveedor prov = new Proveedor();
            if (dr.Read())
            {
                prov.IdProveedor = Convert.ToInt32(dr["ID_PROVEEDOR"]);
                prov.RazonSocial = Convert.ToString(dr["RAZON_SOCIAL"]);
                prov.Cuit = Convert.ToString(dr["CUIT"]);
                prov.IdCiudad = Convert.ToInt32(dr["ID_CIUDAD"]);
                prov.Direccion = Convert.ToString(dr["DIRECCION"]);
                prov.Telefono = Convert.ToString(dr["TELEFONO"]);
                prov.Fax = Convert.ToString(dr["FAX"]);
                prov.SitioWeb = Convert.ToString(dr["SITIO_WEB"]);
                prov.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]);
                prov.MontoMinimo = Convert.ToInt32(dr["MONTO_MINIMO"]);
                prov.Descripcion = Convert.ToString(dr["DESCRIPCION"]);
                prov.DadoBaja = Convert.ToBoolean(dr["DADO_BAJA"]);
            }
            dr.Close();
            return prov;
        }


        public List<ProveedorReadOnly> ObtenerReadOnliesPorNombre(string nombre)
        {
            SqlDataReader dr = daoProv.ObtenerPorNombre(nombre);
            return LeerDataReaderReadOnlyList(dr);
        }

        public bool Existe(Proveedor proveedor)
        {
            return daoProv.Existe(proveedor.IdProveedor);
        }

        public bool ExistePorCampoNoPk(string nombreTabla, string campo, string valor)
        {
            return daoProv.ExistePorCampoNoPk(nombreTabla, campo, valor);
        }

        //public List<ProveedorReadOnly> ObtenerReadOnlies()
        //{
        //    return LeerDataReaderReadOnlyList(daoProv.ObtenerActivos());
        //}

        public List<ProveedorReadOnly> FindAllReadOnlies(bool conBaja)
        {
            List<ProveedorReadOnly> lista = new List<ProveedorReadOnly>();
            ProveedorDao datos = new ProveedorDao();
            SqlDataReader dr = datos.obtenerTodosColumnas(conBaja);
            while (dr.Read())
            {
                ProveedorReadOnly prov = new ProveedorReadOnly();

                //CAMPOS
                //ID_PROVEEDOR, RAZON_SOCIAL, CUIT, ID_CIUDAD, DIRECCION, TELEFONO, FAX, SITIO_WEB,
                //FECHA_ALTA, MONTO_MINIMO, DESCRIPCION, DADO_BAJA

                prov.IdProveedor = int.Parse(dr["ID_PROVEEDOR"].ToString());
                prov.RazonSocial = dr["RAZON_SOCIAL"].ToString();
                prov.Cuit = dr["CUIT"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                {
                    prov.Ciudad = dr["NOMBRE"].ToString();
                }
                else
                {
                    prov.Ciudad = " ";
                }
                prov.Direccion = dr["DIRECCION"].ToString();
                prov.Telefono = dr["TELEFONO"].ToString();
                if (dr["FAX"] != DBNull.Value)
                    prov.Fax = dr["FAX"].ToString();
                if (dr["SITIO_WEB"] != DBNull.Value)
                    prov.SitioWeb = dr["SITIO_WEB"].ToString();
                prov.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();
                prov.MontoMinimo = double.Parse(dr["MONTO_MINIMO"].ToString());
                if (dr["DESCRIPCION"] != DBNull.Value)
                    prov.Descripcion = dr["DESCRIPCION"].ToString();
                prov.DadoBaja = bool.Parse(dr["DADO_BAJA"].ToString());

                lista.Add(prov);
            }
            return lista;
        }

        private List<ProveedorReadOnly> LeerDataReaderReadOnlyList(SqlDataReader dr)
        {
            List<ProveedorReadOnly> listReadOnlies = new List<ProveedorReadOnly>();
            while (dr.Read())
            {
                ProveedorReadOnly readOnlyBus = new ProveedorReadOnly();

                readOnlyBus.IdProveedor = Convert.ToInt32(dr["ID_Proveedor"]);
                readOnlyBus.Cuit = Convert.ToString(dr["CUIT"]);
                readOnlyBus.Descripcion = Convert.ToString(dr["DESCRIPCION"]);
                readOnlyBus.Direccion = Convert.ToString(dr["DIRECCION"]);
                readOnlyBus.Fax = Convert.ToString(dr["FAX"]);
                readOnlyBus.FechaAlta = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();
                readOnlyBus.MontoMinimo = Convert.ToInt32(dr["MONTO_MINIMO"]);
                readOnlyBus.RazonSocial = Convert.ToString(dr["RAZON_SOCIAL"]);
                readOnlyBus.SitioWeb = Convert.ToString(dr["SITIO_WEB"]);
                readOnlyBus.Telefono = Convert.ToString(dr["TELEFONO"]);
                readOnlyBus.DadoBaja = bool.Parse(dr["DADO_BAJA"].ToString());
                listReadOnlies.Add(readOnlyBus);
            }
            dr.Close();
            return listReadOnlies;
        }

        public void Eliminar(Proveedor proveedor)
        {
            daoProv.Eliminar(proveedor.IdProveedor);
        }

        public void Eliminar(int id)
        {
            daoProv.Eliminar(id);
        }

        private string GenerarStringValores(Proveedor proveedor)
        {
            string valores =
                string.Format(
                    "ID_PROVEEDOR ={0}, RAZON_SOCIAL ={1}, CUIT ={2}, ID_CIUDAD ={3}, DIRECCION ={4}, TELEFONO ={5}, FAX ={6}, SITIO_WEB ={7}, FECHA_ALTA ={8}, MONTO_MINIMO ={9}, DESCRIPCION ={10}, DADO_BAJA ={11}",

                    proveedor.IdProveedor,
                    proveedor.RazonSocial,
                    proveedor.Cuit,
                    proveedor.IdCiudad,
                    proveedor.Direccion,
                    proveedor.Telefono,
                    proveedor.Fax,
                    proveedor.SitioWeb,
                    proveedor.FechaAlta,
                    proveedor.MontoMinimo,
                    proveedor.Descripcion,
                    (proveedor.DadoBaja ? 1 : 0));

            return valores;
        }
    }
}
